package com.holystone.splunk.app.service;

import com.github.pagehelper.PageInfo;
import com.holystone.splunk.app.model.AlertVO;
import com.holystone.splunk.app.mybatis.model.Alert;
import com.holystone.splunk.app.mybatis.model.Event;
import com.splunk.FiredAlert;

import java.io.IOException;
import java.text.ParseException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Copyright (c) 2017, HOLYSTONE Technologies, Inc.
 * All right reserved.
 *
 * @author huyan
 * @date 2017/12/1
 * @desc: 告警相关的存入index的操作
 */
public interface IIndexAlertService extends ISplunkIndexService {

    /**
     * 保存新告警
     * @param alert
     * @param events
     */
    void saveAlertFromFiredAlert(FiredAlert alert, Set<Event> events) throws Exception;
    /**
     * 插入单个alert
     *
     * @param alert
     */
    void insertAlert2Index(AlertVO alert) throws IOException;

    /**
     * 获取多个告警，通过sids
     * @param alertSids
     * @return
     */
    List<AlertVO> getAlertsBySids(String alertSids) throws IOException;

    /**
     * 获取已经存在的告警的名称
     * @return
     */
    List<String> getExistsAlertNames() throws IOException;


    /**
     * 获取告警数据中最后一条数据时间
     * @return
     * @throws IOException
     */
    String queryEndTimeAlertData() throws IOException;

    /**
     * 获取告警分页数据
     * @param pageNo
     * @param pageSize
     * @param conditions
     * @return
     */
    PageInfo<AlertVO> getAlertsPageInfo(String pageNo, String pageSize, AlertVO conditions) throws IOException, ParseException;

    /**
     * 获取符合条件的告警列表
     * @param pageNo
     * @param pageSize
     * @param conditions
     * @return
     */
    List<AlertVO> getAlertsByConditions(Integer pageNo, Integer pageSize, AlertVO conditions) throws IOException, ParseException;

    /**
     * 获取告警总数
     * @param conditions
     * @return
     */
    Integer getAlertsTotalByCondtions(AlertVO conditions) throws IOException, ParseException;

    /**
     * 获取告警分页列表（r_md5）
     * @param pageNo
     * @param pageSize
     * @param conditions
     * @return
     */
    PageInfo<AlertVO> getAlertPageInfoByMD5(String pageNo, String pageSize, AlertVO conditions) throws IOException, ParseException;

    /**
     * 获取r_md5值相同的告警列表
     *      与之前的通过条件获取告警的语句有不同，因此单独作为一个查询
     *
     * @param pageNo
     * @param pageSize
     * @param conditions
     * @return
     */
    List<AlertVO> getAlertsByR_MD5(Integer pageNo, Integer pageSize, AlertVO conditions) throws IOException, ParseException;

    /**
     * 获取r_md5值相同的总的告警
     * @param conditions
     * @return
     */
    Integer getAlertsTotalByR_MD5(AlertVO conditions) throws IOException, ParseException;

    /**
     * 获取告警详细日志数据
     * @param alertSid
     * @return
     */
    Map<String,List<AlertVO>> getAlertDataBySid(String alertSid) throws IOException, ParseException;

    /**
     * 解绑告警-事件对应关系
     * @param alertSid
     * @param eventIds
     */
    void unLinkEvents(String alertSid, String eventIds) throws IOException;

    /**
     * 获取告警分页，通过告警sid
     * @param num
     * @param size
     * @param alerts
     * @return
     */
    List<AlertVO> getAlertsByEvent(Integer num, Integer size, Set<Alert> alerts) throws IOException;

    /**
     * 获取告警总数，通过sid
     * @param alerts
     * @return
     */
    Integer getAlertTotalCountByEvent(Set<Alert> alerts) throws IOException;


}
